// 任务:
// 采用链表来模拟栈操作

class Node {
    // 实例遍历prev表示指向前一个节点的指针
    prev = null ;
    // 实例变量item表示当前节点所存储的数据
    item ;
    // 实例遍历next表示指向下一个节点的指针
    next = null ;
    constructor(item){
        this.item=item
    }
}

class Stack {
    // 用来表示栈顶的实例变量
    top = null ;
    // 将item压入栈顶
    push(item){
        // 根据item创建Node实例
        let node = new Node(item);
        // 若栈顶(top)为空则以 node 为栈顶(top)
        if( this.top == null ) {
            this.top = node ;
            return ;
        }
        // 若栈顶(top)已经存在元素
        // 用 原栈顶元素 指向 新的node
        this.top.next = node ;
        // 用 新的node 指向 原栈顶元素
        node.prev = this.top ;
        // 以 新的node 为 新栈顶
        this.top = node ;
    }
    // 检查栈顶元素
    peek(){
        return this.top?.item ; // 注意 ?. 运算符
        //return this.top ? this.top.item : undefined ;
    }
    // 弹出栈顶元素
    pop(){
        if( this.top ) {
            let old = this.top ;
            let prev = old.prev ; // 获得在栈顶元素之前入栈的元素
            if( prev ) {
                prev.next = null ; // 清空 prev 的 next 指向
                this.top = prev ; // 以 prev 为 栈顶元素
                return old.item ;
            }
            // 若prev不存在则认为top就是栈中唯一的元素
            this.top = null ;
            return old.item ;
        }
        throw new Error( 'stack is empty' );
    }
    // 获取栈的字符串形式
    toString(){
        let arr = [] ;
        // 遍历栈中所有元素，并按照从栈底到栈顶的顺序，得到每个节点中的item组成的字符串
        let node = this.top ;
        while( node ) {
            arr.unshift( node.item ) ; // 将获取到的item添加到数组开始位置
            node = node.prev ; // 获取前一个入栈的元素
        }
        //  将数组中各个元素连接成字符串并使用指定的符号做分隔符
        let str = arr.join(',');
        return str ;
    }
}

let stack = new Stack();

// 向栈顶压入元素
stack.push( '孙悟空' );
stack.push( '小白龙' );
stack.push( '猪悟能' );

console.log( stack.toString() ); // 输出: 孙悟空, 小白龙, 猪悟能
// 检查栈顶元素
console.log( stack.peek() ); // 输出: 猪悟能
// 输出栈中所有元素组成的字符串形式
console.log( stack.toString() ); // 输出: 孙悟空, 小白龙, 猪悟能

console.log( '- '.repeat( 10 ) );

// 弹出栈顶元素
console.log( stack.pop() ); // 输出: 猪悟能
console.log( stack.toString() ); // 输出: 孙悟空, 小白龙

console.log( '- '.repeat( 10 ) );

// 弹出栈顶元素
console.log( stack.pop() ); // 输出: 小白龙
console.log( stack.toString() ); // 输出: 孙悟空

console.log( '- '.repeat( 10 ) );

// 弹出栈顶元素
console.log( stack.pop() ); // 输出: 孙悟空
console.log( stack.toString() ); // 输出: 

console.log( '- '.repeat( 10 ) );

// 弹出栈顶元素
console.log( stack.pop() ); // Error